#include<reg51.h>
#include "dht11.h"
#define uint unsigned int
#define uchar unsigned char



//commit dht11


uchar temp_value;//温度
uchar humi_value; //湿度



void delay(uint xms)
{
	uint i,j;
	for(i=0;i<xms;i++)
	for(j=0;j<110;j++);}

	

void DHT11_delay_us(uchar n)
{
    while(--n);
}

void DHT11_delay_ms(uint z)
{
   unsigned int i,j;
   for(i=z;i>0;i--)
      for(j=110;j>0;j--);
}

void DHT11_start()
{
	 io=1;
	 DHT11_delay_us(2);
	 io=0;
	 DHT11_delay_ms(30);   //延时18ms以上
	 io=1;
	 DHT11_delay_us(30);
}

//void InitUART(void)//使用定时器1作为串口波特率发生器
//{

//	SCON=0x40;					//串口通信工作方式1
//	REN=1;						//允许接收
//	TMOD=0x20;					//定时器1的工作方式2
//	TH1=0xfd,TL1=0xfd;		
//	TI=1;                       //这里一定要注意
//	TR1=1;	

//}


uchar DHT11_rec_byte()      //接收一个字节
{
   unsigned char i,dat=0;
  for(i=0;i<8;i++)    //从高到低依次接收8位数据
   {
      while(!io);   ////等待50us低电平过去
      DHT11_delay_us(8);     //延时60us，如果还为高则数据为1，否则为0
      dat<<=1;           //移位使正确接收8位数据，数据为0时直接移位
      if(io==1)    //数据为1时，使dat加1来接收数据1
         dat+=1;
      while(io);  //等待数据线拉低
    }
    return dat;
}

void DHT11_receive()      //接收40位的数据
{
	unsigned char R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
	DHT11_start();
	if(io==0)
	{
		while(io==0);   //等待拉高
		DHT11_delay_us(40);  //拉高后延时80us
		R_H=DHT11_rec_byte();    //接收湿度高八位
		R_L=DHT11_rec_byte();    //接收湿度低八位
		T_H=DHT11_rec_byte();    //接收温度高八位
		T_L=DHT11_rec_byte();    //接收温度低八位
		revise=DHT11_rec_byte(); //接收校正位

		DHT11_delay_us(25);    //结束

		if((R_H+R_L+T_H+T_L)==revise)      //校正
		{
			RH=R_H;
			RL=R_L;
			TH=T_H;
			TL=T_L;
		}
		humi_value = RH;
		temp_value = TH;
	}
}





